package com.aliyun.messagemgt.repository.foura;//package com.aliyun.messagemgt.repository.foura;
//
//
//import com.alibaba.fastjson.JSONObject;
//import com.aliyun.gts.bpaas.framework.api.rest.dto.ResultResponse;
//import com.aliyun.gts.delivery.enterprise.sdk.common.PageQuery;
//import com.aliyun.gts.delivery.enterprise.sdk.common.PageResult;
//import com.aliyun.gts.delivery.enterprise.sdk.orgaccount.OrgAccountService;
//import com.aliyun.gts.delivery.enterprise.sdk.orgaccount.out.AccountInfo;
//import com.aliyun.gts.delivery.enterprise.sdk.orgaccount.out.OrganizationInfo;
//import com.aliyun.gts.delivery.enterprise.sdk.rbac.RbacService;
//import com.aliyun.gts.delivery.enterprise.sdk.rbac.in.AccountRoleQuery;
//import com.aliyun.gts.delivery.enterprise.sdk.rbac.out.Permission;
//import com.aliyun.gts.delivery.enterprise.sdk.rbac.out.Role;
//import com.aliyun.gts.enterprise.foura.rbac.model.FouraFunction;
//import com.aliyun.messagemgt.common.constants.UserConstants;
//import com.aliyun.messagemgt.common.dto.response.ResultMap;
//import com.aliyun.messagemgt.common.dto.foura.DepartmentVo;
//import com.aliyun.messagemgt.common.dto.foura.UserInfo;
//import com.aliyun.messagemgt.common.dto.foura.FourAAuthorityVo;
//import com.aliyun.messagemgt.common.dto.foura.FourAMenu;
//import com.aliyun.messagemgt.common.dto.foura.OrgInfo;
//import com.aliyun.messagemgt.fouraplugin.FouraService;
//import com.aliyun.messagemgt.entities.foura.FourAUserResponse;
//import com.aliyun.messagemgt.entities.foura.FunctionVo;
//import com.aliyun.messagemgt.entities.foura.Pair;
//import com.aliyun.messagemgt.repository.mappers.OrgInfoMapper;
//import com.aliyun.messagemgt.repository.mappers.UserInfoMapper;
//import com.github.pagehelper.PageHelper;
//import com.github.pagehelper.PageInfo;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.collections4.CollectionUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.jasig.cas.client.authentication.AttributePrincipal;
//import org.jasig.cas.client.util.AbstractCasFilter;
//import org.jasig.cas.client.validation.Assertion;
//import org.springframework.beans.BeanUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.stereotype.Service;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @author system
// * @date 2020-12-10 10:09:27
// */
//@Slf4j
//@Service
//public class FouraMyBatisRepository implements FouraService {
//    @Autowired
//    private OrgAccountService orgAccountService;
//    @Autowired
//    private RbacService rbacService;
//    @Autowired
//    private OrgInfoMapper orgInfoMapper;
//    @Autowired
//    private UserInfoMapper userInfoMapper;
//    @Value("${4a.cas.root.departmentCode}")
//    private String rootDepartmentCode;
//    @Override
//    public Map<String, Object> getUser() {
//        return null;
//    }
//
//    @Override
//    public List<DepartmentVo> getAllDepartment() {
//        List<DepartmentVo> departmentVoList = new ArrayList<>();
//        //获取所有的部门信息
//        ResultMap resultMap = getOrganizationInfoByParentCode(rootDepartmentCode);
//        List<OrganizationInfo> organizationInfoList = (List<OrganizationInfo>) resultMap.get(ResultMap.DATA);
//        for (OrganizationInfo organizationInfo : organizationInfoList) {
//            DepartmentVo departmentVo = new DepartmentVo();
//            departmentVo.setDepartmentCode(organizationInfo.getCode());
//            departmentVo.setDepartmentName(organizationInfo.getDisplayName());
//            departmentVoList.add(departmentVo);
//        }
//        return departmentVoList;
//    }
//
//    @Override
//    public ResultMap getOrganizationInfoByParentCode(String orgCode) {
//        //获取父节点下的组织信息
//        ResultResponse<List<OrganizationInfo>>  orgAllList =  orgAccountService.getOrganizationInfoByParentCode(orgCode);
//        List<OrganizationInfo> organizationInfoList = orgAllList.getData();
//        return ResultMap.success(organizationInfoList);
//    }
//
//    @Override
//    public FourAMenu getAuthByUser() {
//        ResultMap resultMap =  this.getUserAndExtUserCode();
//        FourAMenu fourAMenu = new FourAMenu();
//        if(resultMap.get(ResultMap.ERROR_CODE).equals(ResultMap.SUCCESS)){
//            FourAUserResponse fourAUserResponse = (FourAUserResponse) resultMap.get(ResultMap.DATA);
//            ResultResponse<List<Permission>> resultResponse =  rbacService.getPermissionByAccountCode(fourAUserResponse.getUserCode());
//            List<Permission> permissionList =  resultResponse.getData();
//            if (CollectionUtils.isNotEmpty(permissionList)) {
//                List<FunctionVo> functions = new ArrayList<FunctionVo>();
//                Map<String, FunctionVo> funcMap = new HashMap<String, FunctionVo>();
//                for (Permission roleVo : permissionList) {
//                    List<FouraFunction> fouraFunctionList = (List<FouraFunction>) roleVo.getExtentAttributes().get(UserConstants.FUNCTION_LIST);
//                    if (CollectionUtils.isNotEmpty(fouraFunctionList)) {
//                        for (FouraFunction funcVo : fouraFunctionList) {
//                            if (null == funcMap.get(funcVo.getFunccode())) {
//                                FunctionVo functionVo = new FunctionVo();
//                                BeanUtils.copyProperties(funcVo,functionVo);
//                                funcMap.put(funcVo.getFunccode(), functionVo);
//                                functions.add(functionVo);
//                            }
//                        }
//
//                    }
//                }
//                List<FunctionVo> functionVos = new ArrayList<>();
//                functions.stream().map(m -> m.getParentcode()).distinct().forEach(f -> {
//                    List<FunctionVo> collect = functions.stream().filter(filter -> f.equals(filter.getParentcode()))
//                            .sorted((s1, s2) -> {
//                                if(StringUtils.isEmpty(s1.getFuncseq())){
//                                    return 1;
//                                }
//                                if (s1.getFuncseq().compareTo(s2.getFuncseq()) <= 0) {
//                                    return -1;
//                                } else {
//                                    return 1;
//                                }
//                            }).collect(Collectors.toList());
//                    functionVos.addAll(collect);
//                });
//                //返回的functions重构成树形菜单结构
//                Map<String, Pair<FourAAuthorityVo, FunctionVo>> map = new LinkedHashMap<>(functions.size());
//                functionVos.forEach(f -> {
//                    FourAAuthorityVo vo = new FourAAuthorityVo();
//                    vo.setKey(f.getFunccode());
//                    vo.setName(f.getFuncname());
//                    vo.setParent(f.getParentcode());
//                    vo.setUrl(f.getFuncaction());
//                    map.put(f.getFunccode(), new Pair<>(vo, f));
//                });
//
//                List<FourAAuthorityVo> menus = new LinkedList<>();
//                map.values().forEach(p -> {
//                    String funcCode = p.getB().getParentcode();
//                    if (Objects.equals(funcCode, UserConstants.MENU_PARENT_ID)) {
//                        menus.add(p.getA());
//                    } else {
//                        map.get(funcCode).getA().addChild(p.getA());
//                    }
//                });
//                fourAMenu.setMenu(menus);
//                log.info("menus 信息：{}", JSONObject.toJSONString(menus));
//            }
//
//        }
//        return fourAMenu;
//    }
//
//    @Override
//    public ResultMap getUserAndExtUserCode() {
//        FourAUserResponse fourAUserResponse = new FourAUserResponse();
//        ResultResponse<AccountInfo> currentAccountInfo = orgAccountService.getCurrentAccountInfo();
//        log.info("获取用户详细信息为： {} ", JSONObject.toJSONString(currentAccountInfo.toString()));
//        if (currentAccountInfo != null && currentAccountInfo.getData() != null) {
//            AccountInfo accountInfo =  currentAccountInfo.getData();
//            fourAUserResponse.setOrgCode(accountInfo.getCode());
//            Object orgId = accountInfo.getExtentAttributes().get(UserConstants.ORG_ID);
//            if(!Objects.isNull(orgId)){
//                fourAUserResponse.setOrgId(orgId.toString());
//            }
//            Object userId =  accountInfo.getExtentAttributes().get(UserConstants.USER_ID);
//            if(!Objects.isNull(userId)){
//                fourAUserResponse.setUserId(userId.toString());
//            }
//            fourAUserResponse.setUserCode(accountInfo.getCode());
//            fourAUserResponse.setUserName(accountInfo.getUsername());
//            fourAUserResponse.setPhone(accountInfo.getMobilePhone());
//            Object orgName  = accountInfo.getExtentAttributes().get(UserConstants.ORG_NAME);
//            if(!Objects.isNull(orgName)){
//                fourAUserResponse.setDepartmentName(orgName.toString());
//            }
//            fourAUserResponse.setEmail(accountInfo.getEmail());
//            Object userSex  = accountInfo.getExtentAttributes().get(UserConstants.USER_SEX);
//            if(!Objects.isNull(userSex)){
//                fourAUserResponse.setSex(userSex.toString());
//            }
//            Object position  = accountInfo.getExtentAttributes().get(UserConstants.POSITION);
//            if(!Objects.isNull(position)){
//                fourAUserResponse.setPosition(position.toString());
//            }
//            //判断是否是超管
//            fourAUserResponse.setIsAdmin(isAdmin(accountInfo.getCode()));
//        }
//        return ResultMap.success(fourAUserResponse);
//    }
//
//    public Boolean isAdmin(String userCode){
//        AccountRoleQuery accountRoleQuery=new AccountRoleQuery();
//        accountRoleQuery.setAccountCode(userCode);
//        ResultResponse<List<Role>> listResultResponse = rbacService.queryRoleByAccountCode(accountRoleQuery);
//        if (listResultResponse.getSuccess()){
//            List<Role> roles = listResultResponse.getData();
//            for (Role role:roles){
//                if ("SUPER_ADMINISTRATOR".equals(role.getCode())){
//                    return true;
//                }
//            }
//        }
//        return false;
//    }
//
//    @Override
//    public String getSsoUser(HttpServletRequest request) {
//        Assertion assertion = (Assertion) request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
//        AttributePrincipal principal = assertion.getPrincipal();
//        String accountInfo = principal.getName();
//        String userName = accountInfo.split(" ")[0];
//        String userCode = accountInfo.split(" ")[1];
//        return accountInfo;
//    }
//
//    @Override
//    public List<OrgInfo> getRootTree() {
//        List<OrgInfo> rootTree = orgInfoMapper.getRootTree();
//        return rootTree;
//    }
//
//    @Override
//    public PageInfo<UserInfo> getUserByOrgCode(String orgCode, String userName, Integer pageSize, Integer pageNo) {
//        PageHelper.startPage(pageNo, pageSize);
//        List<UserInfo> userByOrgCode = userInfoMapper.getUserByOrgCode(orgCode, userName);
//        PageInfo objectPageInfo = new PageInfo(userByOrgCode);
//        return objectPageInfo;
//    }
//
//    @Override
//    public List<Map<String, Object>> getAllUserInfo(Integer pageSize, Integer pageNo) {
//        return null;
//    }
//
//
//    /**
//     * 同步4A机构及用户信息
//     */
//    @Override
//    public int sync4AData() {
//        int orgCount = sync4AOrgData();
////        int userCount = sync4AUserData();
//        return orgCount;
//    }
//
//    /**
//     * 同步4A组织架构信息
//     * 采用全量数据同步，每次同步时先删除全量数据库中已存在数据，再获取4A全量数据进行插入
//     */
//    public int sync4AOrgData() {
//        //所有组织信息map对象
////        Map<String, Object> allOrgInfo = null;
////        //调用4A通用组件获取所有组织信息接口
////        ResultResponse<OrganizationInfo>  resultResponse = orgAccountService.getAllOrgInfo();
//        Map<String, Object> tree = getTree();
////        //取出所有组织
////        allOrgInfo = resultResponse.getData().getExtentAttribute();
////        //判断是否存在数据
////        if(MapUtils.isEmpty(allOrgInfo)){
////            throw new RuntimeException("获取4A组织架构失败");
////        }
////        //判断是否包含所有组织节点数据
////        Object allOrgList = allOrgInfo.get(UserConstants.ALL_ORG_LIST);
////        if(allOrgList == null){
////            return 0;
////        }
//        List<OrgInfo> orgInfoList = new ArrayList<>();
//        //数据类型转换
//        List<OrganizationInfo> orgList = (List<OrganizationInfo>)tree.get("allOrgList");
//        //封装项目所需组织信息
//        orgList.forEach(e -> {
//            OrgInfo orgInfo = new OrgInfo();
//            String orgId = String.valueOf(e.getExtentAttribute().get("ORG_ID"));
//            orgInfo.setOrgId(orgId);
//            orgInfo.setOrgCode(e.getCode());
//            orgInfo.setOrgName(e.getDisplayName());
//            orgInfo.setOrgStatus("1");
//            orgInfo.setParentCode(e.getParentCode());
//            orgInfo.setParentId(e.getParentCode());
//            orgInfoList.add(orgInfo);
//        });
//        // 先删除全部数据再全量插入
//        orgInfoMapper.deleteAllOrgInfo();
//        //批量插入组织信息到组织表
//        int rows = 0;
//        if(CollectionUtils.isNotEmpty(orgInfoList)){
//            rows = orgInfoMapper.batchOrgInfoInsert(orgInfoList);
//        }
//        //
//        List<AccountInfo> accountInfos = (List<AccountInfo>)tree.get("allUserInfo");
//        sync4AUserData(accountInfos);
//        return rows;
//
//    }
//
//    public Map<String, Object> getTree() {
//        Map<String, Object> map = new HashMap<>();
//        try {
//            List<OrganizationInfo> orgList=new ArrayList<>();
//            List<AccountInfo> accountInfos=new ArrayList<>();
//            ResultResponse<OrganizationInfo> rootOrganization = orgAccountService.getRootOrganization();
//            OrganizationInfo data = rootOrganization.getData();
//            data.setParentCode("0");
//            if (rootOrganization.getData() != null) {
//                ResultResponse<List<OrganizationInfo>> organizationInfoByParentCode = orgAccountService.getOrganizationInfoByParentCode(rootOrganization.getData().getCode());
//                PageQuery pageQuery=new PageQuery();
//                pageQuery.setPageNumber(1);
//                pageQuery.setPageSize(Integer.MAX_VALUE);
//                ResultResponse<PageResult<AccountInfo>> organizationMembersByOrgCode = orgAccountService.getOrganizationMembersByOrgCode(pageQuery, rootOrganization.getData().getCode());
//                accountInfos.addAll(organizationMembersByOrgCode.getData().getRows());
//                orgList.add(data);
//                List<OrganizationInfo> orgs = organizationInfoByParentCode.getData();
//                orgList.addAll(orgs);
//                digui(orgs,orgList,accountInfos); //调用递归算法查询市以下的区县
//                rootOrganization.getData().setSubOrgs(orgs);
//            }
//            map.put("tree", rootOrganization.getData());
//            map.put("allOrgList", orgList);
//            map.put("allUserInfo", accountInfos);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return map;
//    }
//
//    public void digui(List<OrganizationInfo> orgs,List<OrganizationInfo> orgList,List<AccountInfo> accountInfos) {
//        List<OrganizationInfo> retList = new ArrayList<>();
//        for (OrganizationInfo c : orgs) {
//            ResultResponse<List<OrganizationInfo>> organizationInfoByParentCode = orgAccountService.getOrganizationInfoByParentCode(c.getCode());
//            PageQuery pageQuery=new PageQuery();
//            pageQuery.setPageNumber(1);
//            pageQuery.setPageSize(Integer.MAX_VALUE);
//            ResultResponse<PageResult<AccountInfo>> organizationMembersByOrgCode = orgAccountService.getOrganizationMembersByOrgCode(pageQuery, c.getCode());
//            retList = organizationInfoByParentCode.getData();
//            orgList.addAll(retList);
//            if (organizationMembersByOrgCode.getSuccess()){
//                accountInfos.addAll(organizationMembersByOrgCode.getData().getRows());
//            }
//            if (retList.size() > 0) {
//                c.setSubOrgs(retList);
//                digui(retList,orgList,accountInfos); //循环调用自己
//            }
//        }
//    }
//
//    /**
//     * 同步4A用户信息
//     * 根据4A用户信息的USER_CODE 进行更新或插入操作
//     */
//    public int sync4AUserData(List<AccountInfo> rows) {
////        Map<String, Object> tree = getTree();
////        List<AccountInfo> rows = (List<AccountInfo>)tree.get("allUserInfo");
////        ResultResponse<List<AccountInfo>> allUserInfo = orgAccountService.getAllUserInfo(Integer.MAX_VALUE);
////        List<AccountInfo> rows = allUserInfo.getData();
//        if(CollectionUtils.isEmpty(rows)){
//            return 0;
//        }
//        List<AccountInfo> newList = new ArrayList<>();
//        for (AccountInfo info: rows) {
//            Map<String, Object> userMap = info.getExtentAttributes();
//            //判断是否属于： 如果用户在4A中关联多个组织，这里ORG_CODE，ORG_NAME会是被用逗号隔开的格式，需要将此种数据分裂为多条
////            if (String.valueOf(userMap.get(UserConstants.ORG_CODE)).indexOf(",") != -1) {
////                String[] orgCodes = String.valueOf(userMap.get(UserConstants.ORG_CODE)).split(",");
////                String[] orgNames = String.valueOf(userMap.get(UserConstants.ORG_NAME)).split(",");
////                for (int i = 0; i < orgCodes.length; i++) {
//            AccountInfo accountInfo = info;
//            // 用户信息根据ORG_CODE，ORG_NAME分裂为多个
//            Map copyMap = new HashMap();
//            copyMap.putAll(userMap);
//            copyMap.put("ORG_CODE", info.getExtentAttributes().get("ORG_CODE"));
//            copyMap.put("ORG_NAME", info.getExtentAttributes().get("FULL_NAME"));
//            accountInfo.setExtentAttributes(copyMap);
//            newList.add(accountInfo);
////                }
////            }else {
////                newList.add(info);
////            }
//        }
//        // 组装成mgt的用户信息
//        List<UserInfo> userList = new ArrayList();
//        List<String> userCodes = new ArrayList<>();
//        newList.forEach(data -> {
//            UserInfo userInfo = new UserInfo();
//            Object userId = data.getExtentAttributes().get(UserConstants.USER_ID);
//            if(Objects.nonNull(userId)){
//                userInfo.setUserId(Long.parseLong(userId.toString()));
//            }
//            userInfo.setUserName( StringUtils.isNotBlank(data.getUsername()) ? data.getUsername() : null);
//            userInfo.setUserCode(StringUtils.isNotBlank(data.getCode())  ? data.getCode() : null);
//            Object orgId = data.getExtentAttributes().get(UserConstants.ORG_ID);
//            if(Objects.nonNull(orgId)){
//                userInfo.setOrgId(String.valueOf(orgId));
//            }
//            Object orgCode = data.getExtentAttributes().get(UserConstants.ORG_CODE);
//            if(Objects.nonNull(orgCode)){
//                userInfo.setOrgCode(String.valueOf(orgCode));
//            }
//            Object orgName = data.getExtentAttributes().get(UserConstants.ORG_NAME);
//            if(Objects.nonNull(orgName)){
//                userInfo.setOrgName(String.valueOf(orgName));
//            }
//            userInfo.setStateDelete(0);
//            userInfo.setHiddenState(1);
//            userInfo.setUserMobile(StringUtils.isNotBlank(data.getMobilePhone()) ? data.getMobilePhone() : null);
//            userInfo.setOfficeEmail(StringUtils.isNotBlank(data.getEmail()) ? data.getEmail() : null);
//            Object userType = data.getExtentAttributes().get(UserConstants.USER_TYPE);
//            if(Objects.nonNull(userType) && StringUtils.isNotBlank(String.valueOf(userType))){
//                userInfo.setUserType(Integer.parseInt(String.valueOf(userType)));
//            }
//            Object userPartType = data.getExtentAttributes().get(UserConstants.USER_PART_TYPE);
//            if(Objects.nonNull(userPartType) && StringUtils.isNotBlank(String.valueOf(userPartType))){
//                userInfo.setUserPartType(Integer.parseInt(String.valueOf(userPartType)));
//            }
//            Object userJobDesc = data.getExtentAttributes().get(UserConstants.USER_JOB_DESC);
//            if(Objects.nonNull(userJobDesc)){
//                userInfo.setDescription(userJobDesc.toString());
//            }
//            userInfo.setCreateTime(new Date());
//            userInfo.setUpdateTime(new Date());
//            userInfo.setModifyTime(new Date());
//            userList.add(userInfo);
//            userCodes.add( StringUtils.isNotBlank(data.getCode())  ? data.getCode() : null);
//        });
//        if(CollectionUtils.isNotEmpty(userCodes)){
//            // 将不在此次同步数据中的用户信息更信息为已删除
//            userInfoMapper.deleteNotExistsUser(userCodes);
//        }
//
////        List<UserInfo> userInfos = userInfoMapper.queryAllUserInfo();
////        for (UserInfo userInfo:userInfos){
////            for (UserInfo userInfo1:userList){
////                if (userInfo.getUserCode().equals(userInfo1.getUserCode())){
////                    userInfo1.setUserId();
////                }
////            }
////        }
//        int i = 0;
//        if(CollectionUtils.isNotEmpty(userList)){
//            // 存在即更新，如果用户已经存在，更新用户信息； 用户不存在就新增
//            i = userInfoMapper.insertOrUpdate(userList);
//        }
//        return i;
//
//    }
//
//}
